// 文件工具函数
// 提供文件相关的工具方法

/**
 * 格式化文件大小
 * @param {number} bytes 字节数
 * @returns {string} 格式化后的大小
 */
export function formatFileSize(bytes) {
  if (bytes === 0) return '0 B'
  
  const k = 1024
  const sizes = ['B', 'KB', 'MB', 'GB', 'TB']
  const i = Math.floor(Math.log(bytes) / Math.log(k))
  
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}

/**
 * 格式化日期时间
 * @param {string|Date} date 日期
 * @returns {string} 格式化后的日期时间
 */
export function formatDateTime(date) {
  if (!date) return '-'
  const d = new Date(date)
  if (Number.isNaN(d.getTime())) return '-'

  const y = d.getFullYear()
  const m = String(d.getMonth() + 1).padStart(2, '0')
  const day = String(d.getDate()).padStart(2, '0')
  const hh = String(d.getHours()).padStart(2, '0')
  const mm = String(d.getMinutes()).padStart(2, '0')
  // 紧凑型展示，避免表格折行
  return `${y}-${m}-${day} ${hh}:${mm}`
}

/**
 * 完整时间格式：yyyy 年 MM 月 dd 日 HH:mm:ss
 */
export function formatDateTimeFull(date) {
  if (!date) return '-'
  const d = new Date(date)
  if (Number.isNaN(d.getTime())) return '-'
  const y = d.getFullYear()
  const m = String(d.getMonth() + 1).padStart(2, '0')
  const day = String(d.getDate()).padStart(2, '0')
  const hh = String(d.getHours()).padStart(2, '0')
  const mm = String(d.getMinutes()).padStart(2, '0')
  const ss = String(d.getSeconds()).padStart(2, '0')
  return `${y} 年 ${m} 月 ${day} 日 ${hh}:${mm}:${ss}`
}

/**
 * 获取文件类型图标
 * @param {string} fileType 文件类型
 * @param {string} extension 文件扩展名
 * @returns {string} 图标名称
 */
export function getFileIcon(fileType, extension = '') {
  const iconMap = {
    document: 'Document',
    spreadsheet: 'Grid',
    presentation: 'Present',
    image: 'Picture',
    video: 'VideoPlay',
    audio: 'Headphone',
    archive: 'Box',
    code: 'DocumentCopy',
    folder: 'Folder',
    other: 'Document'
  }
  
  return iconMap[fileType] || iconMap.other
}

/**
 * 获取文件类型的中文名称
 * @param {string} fileType 文件类型
 * @returns {string} 中文名称
 */
export function getFileTypeName(fileType) {
  const typeNames = {
    document: '文档',
    spreadsheet: '表格',
    presentation: '演示文稿',
    image: '图片',
    video: '视频',
    audio: '音频',
    archive: '压缩包',
    code: '代码',
    folder: '文件夹',
    other: '其他'
  }
  
  return typeNames[fileType] || typeNames.other
}

/**
 * 获取文件类型选项列表
 * @returns {Array} 文件类型选项
 */
export function getFileTypeOptions() {
  return [
    { label: '所有类型', value: 'all' },
    { label: '文档', value: 'document' },
    { label: '表格', value: 'spreadsheet' },
    { label: '演示文稿', value: 'presentation' },
    { label: '图片', value: 'image' },
    { label: '视频', value: 'video' },
    { label: '音频', value: 'audio' },
    { label: '压缩包', value: 'archive' },
    { label: '代码', value: 'code' },
    { label: '其他', value: 'other' }
  ]
}

/**
 * 复制文本到剪贴板
 * @param {string} text 要复制的文本
 * @returns {Promise<boolean>} 是否复制成功
 */
export async function copyToClipboard(text) {
  try {
    if (navigator.clipboard && window.isSecureContext) {
      // 使用现代 Clipboard API
      await navigator.clipboard.writeText(text)
      return true
    } else {
      // 降级方案：使用 document.execCommand
      const textArea = document.createElement('textarea')
      textArea.value = text
      textArea.style.position = 'fixed'
      textArea.style.opacity = '0'
      document.body.appendChild(textArea)
      textArea.focus()
      textArea.select()
      
      const successful = document.execCommand('copy')
      document.body.removeChild(textArea)
      return successful
    }
  } catch (error) {
    console.error('复制到剪贴板失败:', error)
    return false
  }
}

/**
 * 打开文件所在目录
 * @param {string} filePath 文件路径
 */
export function openFileLocation(filePath) {
  try {
    // 在macOS中打开Finder并定位到文件
    const fullPath = `file://${filePath}`
    
    // 尝试使用不同的方法打开文件位置
    if (window.electronAPI) {
      // 如果是Electron应用
      window.electronAPI.showItemInFolder(filePath)
    } else {
      // 在浏览器中，尝试打开文件夹
      window.open(fullPath, '_blank')
    }
  } catch (error) {
    console.error('打开文件位置失败:', error)
    // 作为备选方案，复制路径到剪贴板
    copyToClipboard(filePath)
  }
}

/**
 * 防抖函数
 * @param {Function} func 要防抖的函数
 * @param {number} delay 延迟时间（毫秒）
 * @returns {Function} 防抖后的函数
 */
export function debounce(func, delay) {
  let timeoutId
  return function (...args) {
    clearTimeout(timeoutId)
    timeoutId = setTimeout(() => func.apply(this, args), delay)
  }
}

/**
 * 节流函数
 * @param {Function} func 要节流的函数
 * @param {number} limit 时间间隔（毫秒）
 * @returns {Function} 节流后的函数
 */
export function throttle(func, limit) {
  let inThrottle
  return function (...args) {
    if (!inThrottle) {
      func.apply(this, args)
      inThrottle = true
      setTimeout(() => inThrottle = false, limit)
    }
  }
}

/**
 * 高亮搜索关键词
 * @param {string} text 原始文本
 * @param {string} keyword 搜索关键词
 * @returns {string} 高亮后的HTML
 */
export function highlightKeyword(text, keyword) {
  if (!keyword || !text) return text
  
  const regex = new RegExp(`(${keyword})`, 'gi')
  return text.replace(regex, '<mark>$1</mark>')
}

/**
 * 获取文件扩展名
 * @param {string} fileName 文件名
 * @returns {string} 扩展名（不包含点号）
 */
export function getFileExtension(fileName) {
  const lastDot = fileName.lastIndexOf('.')
  return lastDot > 0 ? fileName.substring(lastDot + 1).toLowerCase() : ''
}

/**
 * 构建面包屑导航数据
 * @param {string} filePath 文件路径
 * @returns {Array} 面包屑数组
 */
export function buildBreadcrumb(filePath) {
  if (!filePath) return []
  
  const parts = filePath.split('/').filter(part => part)
  const breadcrumb = []
  let currentPath = ''
  
  parts.forEach((part, index) => {
    currentPath += (index === 0 ? '' : '/') + part
    breadcrumb.push({
      name: part,
      path: currentPath,
      isLast: index === parts.length - 1
    })
  })
  
  return breadcrumb
}

/**
 * 计算扫描进度百分比
 * @param {number} scanned 已扫描数量
 * @param {number} total 总数量
 * @returns {number} 百分比（0-100）
 */
export function calculateProgress(scanned, total) {
  if (total === 0) return 0
  return Math.min(Math.round((scanned / total) * 100), 100)
}

/**
 * 格式化扫描持续时间
 * @param {number} milliseconds 毫秒数
 * @returns {string} 格式化的时间
 */
export function formatDuration(milliseconds) {
  if (!milliseconds || milliseconds < 0) return '00:00'
  
  const seconds = Math.floor(milliseconds / 1000)
  const minutes = Math.floor(seconds / 60)
  const hours = Math.floor(minutes / 60)
  
  if (hours > 0) {
    return `${hours.toString().padStart(2, '0')}:${(minutes % 60).toString().padStart(2, '0')}:${(seconds % 60).toString().padStart(2, '0')}`
  } else {
    return `${minutes.toString().padStart(2, '0')}:${(seconds % 60).toString().padStart(2, '0')}`
  }
}

/**
 * 验证搜索关键词
 * @param {string} keyword 搜索关键词
 * @returns {Object} 验证结果
 */
export function validateSearchKeyword(keyword) {
  const result = {
    isValid: false,
    message: '',
    sanitized: ''
  }
  
  if (!keyword || typeof keyword !== 'string') {
    result.message = '请输入搜索关键词'
    return result
  }
  
  const trimmed = keyword.trim()
  
  if (trimmed.length === 0) {
    result.message = '搜索关键词不能为空'
    return result
  }
  
  if (trimmed.length > 100) {
    result.message = '搜索关键词过长（最多100个字符）'
    return result
  }
  
  // 过滤特殊字符
  const sanitized = trimmed.replace(/[<>:"'|?*]/g, '')
  
  result.isValid = true
  result.sanitized = sanitized
  return result
}